@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 +22 -0
- package/dist/bin/rness.js +2 -2
- package/dist/{chunk-PW5RMU2G.js → chunk-A7NX55WK.js} +2 -2
- package/dist/{chunk-OUZQGG6V.js → chunk-DFGZWBBW.js} +187 -127
- package/dist/chunk-DFGZWBBW.js.map +1 -0
- package/dist/{chunk-SX7D5W43.js → chunk-H5E6FMP6.js} +45 -15
- package/dist/chunk-H5E6FMP6.js.map +1 -0
- package/dist/index.js +2 -2
- package/dist/{note-MKUG7GOT.js → note-PANYS7DK.js} +3 -3
- package/dist/{summary-5DVUIOJM.js → summary-K5ETHXOX.js} +3 -3
- package/package.json +1 -1
- package/dist/chunk-OUZQGG6V.js.map +0 -1
- package/dist/chunk-SX7D5W43.js.map +0 -1
- /package/dist/{chunk-PW5RMU2G.js.map → chunk-A7NX55WK.js.map} +0 -0
- /package/dist/{note-MKUG7GOT.js.map → note-PANYS7DK.js.map} +0 -0
- /package/dist/{summary-5DVUIOJM.js.map → summary-K5ETHXOX.js.map} +0 -0
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-
|
|
7
|
+
} from "../chunk-H5E6FMP6.js";
|
|
8
8
|
import {
|
|
9
9
|
VERSION,
|
|
10
10
|
reportError
|
|
11
|
-
} from "../chunk-
|
|
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-
|
|
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-
|
|
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
|
|
87
|
-
import { join
|
|
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 =
|
|
115
|
-
return markdownItem(path, rel, await
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
-
|
|
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
|
|
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 =
|
|
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
|
|
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 "${
|
|
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.
|
|
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
|
|
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
|
|
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({
|
|
4948
|
+
subs.push({ clean, base });
|
|
4878
4949
|
}
|
|
4950
|
+
const entry = await entryFor(input.root, name);
|
|
4879
4951
|
let action;
|
|
4880
|
-
if (
|
|
4881
|
-
const
|
|
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/${
|
|
4884
|
-
if (origin
|
|
4885
|
-
throw new Error(`org/${
|
|
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 {
|
|
4893
|
-
if (!await exists(
|
|
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(
|
|
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 =
|
|
4910
|
-
const r = relative2(clone2,
|
|
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(
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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-
|
|
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-
|
|
7022
|
+
//# sourceMappingURL=chunk-DFGZWBBW.js.map
|