@sous-io/sous 0.2.37 → 1.0.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.
Files changed (244) hide show
  1. package/README.md +14 -256
  2. package/dist/bin.js +11 -0
  3. package/dist/sous.js +1094 -0
  4. package/docs/markdown/README.md +5 -4
  5. package/docs/markdown/_sidebar.md +21 -1
  6. package/docs/markdown/commands.md +294 -431
  7. package/docs/markdown/config-discovery.md +25 -14
  8. package/docs/markdown/config-inspection.md +53 -31
  9. package/docs/markdown/config-layers.md +168 -66
  10. package/docs/markdown/config-variables.md +44 -11
  11. package/docs/markdown/configuration.md +104 -17
  12. package/docs/markdown/design-principles.md +4 -1
  13. package/docs/markdown/repositories-authoring.md +30 -0
  14. package/docs/markdown/repositories-consuming.md +72 -14
  15. package/docs/markdown/repositories-file-formats.md +31 -13
  16. package/docs/markdown/repositories-providers.md +48 -57
  17. package/docs/markdown/repositories-quickstart.md +3 -2
  18. package/docs/markdown/repositories-troubleshooting.md +27 -1
  19. package/docs/markdown/repositories-variables.md +6 -1
  20. package/docs/markdown/repositories.md +18 -8
  21. package/package.json +48 -107
  22. package/recipes/core/sous-skills/skills/about-liquid-templates/SKILL.tpl.md +4 -6
  23. package/recipes/core/sous-skills/skills/about-liquid-templates/references/liquid-filters.tpl.md +2 -0
  24. package/recipes/core/sous-skills/skills/about-sous/SKILL.tpl.md +10 -9
  25. package/recipes/core/sous-skills/skills/about-sous-configuration/SKILL.tpl.md +35 -14
  26. package/recipes/core/sous-skills/skills/about-sous-recipes/SKILL.tpl.md +51 -20
  27. package/recipes/core/sous-skills/sous.recipe.yaml +1 -1
  28. package/sous.config.schema.json +351 -132
  29. package/bin/run.js +0 -51
  30. package/src/base-command.ts +0 -457
  31. package/src/commands/build.ts +0 -181
  32. package/src/commands/clear.ts +0 -79
  33. package/src/commands/compile.ts +0 -155
  34. package/src/commands/config/get.ts +0 -110
  35. package/src/commands/config/show.ts +0 -32
  36. package/src/commands/config/validate.ts +0 -53
  37. package/src/commands/help.ts +0 -46
  38. package/src/commands/init.ts +0 -289
  39. package/src/commands/launch.ts +0 -139
  40. package/src/commands/lock/rebuild.ts +0 -239
  41. package/src/commands/lock/show.ts +0 -115
  42. package/src/commands/namespace/list.ts +0 -138
  43. package/src/commands/namespace/show.ts +0 -130
  44. package/src/commands/prune.ts +0 -43
  45. package/src/commands/recipe/list.ts +0 -112
  46. package/src/commands/recipe/show.ts +0 -439
  47. package/src/commands/repo/add.ts +0 -145
  48. package/src/commands/repo/contribute.ts +0 -604
  49. package/src/commands/repo/gc.ts +0 -173
  50. package/src/commands/repo/init.ts +0 -136
  51. package/src/commands/repo/link.ts +0 -899
  52. package/src/commands/repo/list.ts +0 -236
  53. package/src/commands/repo/release.ts +0 -685
  54. package/src/commands/repo/remove.ts +0 -194
  55. package/src/commands/repo/search.ts +0 -243
  56. package/src/commands/repo/submit.ts +0 -341
  57. package/src/commands/repo/unlink.ts +0 -461
  58. package/src/commands/subscription/add.ts +0 -286
  59. package/src/commands/subscription/list.ts +0 -208
  60. package/src/commands/subscription/remove.ts +0 -182
  61. package/src/commands/subscription/update.ts +0 -216
  62. package/src/commands/update.ts +0 -178
  63. package/src/commands/vars/ask.ts +0 -417
  64. package/src/commands/vars/index.ts +0 -79
  65. package/src/commands/vars/list.ts +0 -67
  66. package/src/commands/vars/show.ts +0 -77
  67. package/src/config-command.ts +0 -30
  68. package/src/lib/build-preparation.ts +0 -128
  69. package/src/lib/build-service.ts +0 -580
  70. package/src/lib/config-discovery.ts +0 -378
  71. package/src/lib/config-inspect.ts +0 -145
  72. package/src/lib/config-kernel.mjs +0 -379
  73. package/src/lib/config-schema.ts +0 -401
  74. package/src/lib/env-file.ts +0 -328
  75. package/src/lib/env-local.ts +0 -212
  76. package/src/lib/errors.ts +0 -32
  77. package/src/lib/glob-pattern.ts +0 -24
  78. package/src/lib/include-resolver.ts +0 -523
  79. package/src/lib/interactive.ts +0 -165
  80. package/src/lib/markdown-compiler.ts +0 -947
  81. package/src/lib/package-info.ts +0 -25
  82. package/src/lib/pid-service.ts +0 -99
  83. package/src/lib/project-install.d.mts +0 -44
  84. package/src/lib/project-install.mjs +0 -234
  85. package/src/lib/project-scaffold/index.ts +0 -332
  86. package/src/lib/project-scaffold/templates.ts +0 -240
  87. package/src/lib/repos/catalog-display.ts +0 -215
  88. package/src/lib/repos/catalog-inputs.ts +0 -288
  89. package/src/lib/repos/catalog.ts +0 -842
  90. package/src/lib/repos/contribute.ts +0 -452
  91. package/src/lib/repos/core-recipe.ts +0 -105
  92. package/src/lib/repos/declarations.ts +0 -187
  93. package/src/lib/repos/defaults.ts +0 -175
  94. package/src/lib/repos/formats/common.ts +0 -440
  95. package/src/lib/repos/formats/index-file.ts +0 -253
  96. package/src/lib/repos/formats/links-map.ts +0 -98
  97. package/src/lib/repos/formats/lockfile.ts +0 -169
  98. package/src/lib/repos/formats/patterns.ts +0 -57
  99. package/src/lib/repos/formats/recipe-manifest.ts +0 -205
  100. package/src/lib/repos/formats/repo-manifest.ts +0 -97
  101. package/src/lib/repos/formats/store-entry.ts +0 -84
  102. package/src/lib/repos/formats/variable-definition.ts +0 -268
  103. package/src/lib/repos/freshness.ts +0 -264
  104. package/src/lib/repos/git-clone.ts +0 -850
  105. package/src/lib/repos/identity.ts +0 -89
  106. package/src/lib/repos/index.ts +0 -57
  107. package/src/lib/repos/links.ts +0 -356
  108. package/src/lib/repos/load-manifest.ts +0 -237
  109. package/src/lib/repos/lock-service.ts +0 -454
  110. package/src/lib/repos/locked-namespace-resolver.ts +0 -232
  111. package/src/lib/repos/locked-recipe-lookup.ts +0 -123
  112. package/src/lib/repos/locked-recipes.ts +0 -254
  113. package/src/lib/repos/managed-layer.ts +0 -422
  114. package/src/lib/repos/memories-hash-name.ts +0 -33
  115. package/src/lib/repos/namespace-resolver.ts +0 -527
  116. package/src/lib/repos/providers/base.ts +0 -268
  117. package/src/lib/repos/providers/git.ts +0 -245
  118. package/src/lib/repos/providers/github.ts +0 -589
  119. package/src/lib/repos/providers/gitlab.ts +0 -332
  120. package/src/lib/repos/providers/http.ts +0 -128
  121. package/src/lib/repos/providers/index-cache.ts +0 -421
  122. package/src/lib/repos/providers/index.ts +0 -106
  123. package/src/lib/repos/providers/local.ts +0 -410
  124. package/src/lib/repos/providers/provider.ts +0 -615
  125. package/src/lib/repos/recipe-config-layers.ts +0 -316
  126. package/src/lib/repos/recipe-key-matcher.ts +0 -62
  127. package/src/lib/repos/recipe-memories.ts +0 -178
  128. package/src/lib/repos/recipe-targets.ts +0 -236
  129. package/src/lib/repos/ref-search.ts +0 -46
  130. package/src/lib/repos/release/bump.ts +0 -161
  131. package/src/lib/repos/release/changelog.ts +0 -461
  132. package/src/lib/repos/release/git-state.ts +0 -460
  133. package/src/lib/repos/release/index-builder.ts +0 -1108
  134. package/src/lib/repos/release/index.ts +0 -19
  135. package/src/lib/repos/release/plan.ts +0 -521
  136. package/src/lib/repos/release/settle.ts +0 -154
  137. package/src/lib/repos/release/submissions.ts +0 -214
  138. package/src/lib/repos/release/submit-checkout.ts +0 -290
  139. package/src/lib/repos/release/submit-questions.ts +0 -153
  140. package/src/lib/repos/release/submit-service.ts +0 -898
  141. package/src/lib/repos/release/tags.ts +0 -239
  142. package/src/lib/repos/release/validate.ts +0 -463
  143. package/src/lib/repos/resolver.ts +0 -1028
  144. package/src/lib/repos/scaffold/index.ts +0 -245
  145. package/src/lib/repos/scaffold/templates.ts +0 -517
  146. package/src/lib/repos/seed.ts +0 -473
  147. package/src/lib/repos/store/contract.ts +0 -64
  148. package/src/lib/repos/store/hash.ts +0 -191
  149. package/src/lib/repos/store/recipe-store.ts +0 -599
  150. package/src/lib/repos/store/settings.ts +0 -58
  151. package/src/lib/repos/subscription-service.ts +0 -3859
  152. package/src/lib/repos/trust.ts +0 -447
  153. package/src/lib/repos/update-plan.ts +0 -235
  154. package/src/lib/self-update/index.ts +0 -14
  155. package/src/lib/self-update/installs.ts +0 -413
  156. package/src/lib/self-update/managers.ts +0 -126
  157. package/src/lib/self-update/plan.ts +0 -315
  158. package/src/lib/self-update/registry.ts +0 -99
  159. package/src/lib/self-update/run.ts +0 -506
  160. package/src/lib/self-update/versions.ts +0 -243
  161. package/src/lib/settings.ts +0 -1107
  162. package/src/lib/sous-home.ts +0 -104
  163. package/src/lib/state.ts +0 -167
  164. package/src/lib/vars/answers.ts +0 -192
  165. package/src/lib/vars/ask.ts +0 -1152
  166. package/src/lib/vars/definition-source.ts +0 -261
  167. package/src/lib/vars/display.ts +0 -231
  168. package/src/lib/vars/index.ts +0 -20
  169. package/src/lib/vars/ladder.ts +0 -282
  170. package/src/lib/vars/mappings.ts +0 -260
  171. package/src/lib/vars/names.ts +0 -94
  172. package/src/lib/vars/preanswers.ts +0 -395
  173. package/src/lib/vars/question-plan.ts +0 -241
  174. package/src/lib/vars/report.ts +0 -228
  175. package/src/lib/vars/safe-regex.ts +0 -235
  176. package/src/lib/vars/secrets.ts +0 -131
  177. package/src/lib/vars/validate.ts +0 -312
  178. package/src/lib/version-report.ts +0 -90
  179. package/src/lib/watch-loop.ts +0 -148
  180. package/src/lib/watch-service.ts +0 -116
  181. package/src/services/ref-resolver/container.ts +0 -107
  182. package/src/services/ref-resolver/dependency.ts +0 -60
  183. package/src/services/ref-resolver/format.ts +0 -197
  184. package/src/services/ref-resolver/glob.ts +0 -115
  185. package/src/services/ref-resolver/hash-names.ts +0 -155
  186. package/src/services/ref-resolver/index.ts +0 -55
  187. package/src/services/ref-resolver/injectable.ts +0 -36
  188. package/src/services/ref-resolver/location.ts +0 -62
  189. package/src/services/ref-resolver/lookups/cached-index-lookup.ts +0 -53
  190. package/src/services/ref-resolver/lookups/catalog-lookup.ts +0 -23
  191. package/src/services/ref-resolver/lookups/catalog-matcher.ts +0 -261
  192. package/src/services/ref-resolver/lookups/chained-lookup.ts +0 -27
  193. package/src/services/ref-resolver/lookups/env-var-lookup.ts +0 -65
  194. package/src/services/ref-resolver/lookups/fetched-index-lookup.ts +0 -150
  195. package/src/services/ref-resolver/lookups/recorded-dependency-lookup.ts +0 -62
  196. package/src/services/ref-resolver/lookups/ref-lookup.ts +0 -54
  197. package/src/services/ref-resolver/lookups/variable-lookup.ts +0 -123
  198. package/src/services/ref-resolver/named-refs.ts +0 -144
  199. package/src/services/ref-resolver/parser/env-var-splitter.ts +0 -27
  200. package/src/services/ref-resolver/parser/location-splitter.ts +0 -239
  201. package/src/services/ref-resolver/parser/name-path-splitter.ts +0 -200
  202. package/src/services/ref-resolver/parser/partial-ref.ts +0 -84
  203. package/src/services/ref-resolver/parser/query-splitter.ts +0 -61
  204. package/src/services/ref-resolver/parser/range-splitter.ts +0 -52
  205. package/src/services/ref-resolver/parser/ref-parser.ts +0 -115
  206. package/src/services/ref-resolver/parser/repo-qualifier-splitter.ts +0 -51
  207. package/src/services/ref-resolver/parts.ts +0 -115
  208. package/src/services/ref-resolver/pruners/command-line-pruner.ts +0 -47
  209. package/src/services/ref-resolver/pruners/include-pruner.ts +0 -66
  210. package/src/services/ref-resolver/pruners/manifest-pruner.ts +0 -130
  211. package/src/services/ref-resolver/pruners/ref-pruner.ts +0 -135
  212. package/src/services/ref-resolver/pruners/rule-helpers.ts +0 -44
  213. package/src/services/ref-resolver/pruners/stored-key-pruner.ts +0 -136
  214. package/src/services/ref-resolver/ref-helpers.ts +0 -62
  215. package/src/services/ref-resolver/ref-picker-service.ts +0 -204
  216. package/src/services/ref-resolver/ref-report.ts +0 -84
  217. package/src/services/ref-resolver/ref-resolve-arguments.ts +0 -47
  218. package/src/services/ref-resolver/ref-resolve-result.ts +0 -36
  219. package/src/services/ref-resolver/ref-resolver-service.ts +0 -323
  220. package/src/services/ref-resolver/source.ts +0 -48
  221. package/src/services/ref-resolver/tokens.ts +0 -25
  222. package/src/services/ref-resolver/types.ts +0 -155
  223. package/src/templating/filters/bullet-list.ts +0 -9
  224. package/src/templating/filters/index.ts +0 -8
  225. package/src/templating/init-liquid-engine.ts +0 -139
  226. package/src/templating/lib/glob-files.ts +0 -74
  227. package/src/templating/lib/import-export.ts +0 -32
  228. package/src/templating/lib/secret-scope.ts +0 -41
  229. package/src/templating/lib/tag-args.ts +0 -19
  230. package/src/templating/tags/exportScalarVarsJs.ts +0 -46
  231. package/src/templating/tags/getFiles.ts +0 -89
  232. package/src/templating/tags/index.ts +0 -14
  233. package/src/templating/tags/listFiles.ts +0 -54
  234. package/src/templating/tags/showVars.ts +0 -28
  235. package/src/utils/choice-prompt.ts +0 -143
  236. package/src/utils/command-errors.ts +0 -186
  237. package/src/utils/command-help.ts +0 -45
  238. package/src/utils/confirm-prompt.ts +0 -110
  239. package/src/utils/flags.ts +0 -177
  240. package/src/utils/formatting.ts +0 -849
  241. package/src/utils/prompts.ts +0 -53
  242. package/src/utils/sous-directory.ts +0 -245
  243. package/src/utils/table.ts +0 -603
  244. package/src/utils/value-prompt.ts +0 -119
@@ -1,53 +0,0 @@
1
- import { confirm as inquire, select } from "@inquirer/prompts";
2
- import { color } from "@oclif/color";
3
-
4
- import { blankLine, blankLines, log } from "./formatting.js";
5
-
6
- /**
7
- * Ask a yes or no question and hand back the answer, leaving the decision about
8
- * what to do with a "no" to the caller. `areYouSure` is the variant that ends
9
- * the process; use this one where a refusal has to be reported rather than
10
- * simply obeyed.
11
- *
12
- * @param prompt - The question to ask.
13
- * @param defaultAnswer - What Enter alone means. Defaults to no.
14
- */
15
- export async function askYesNo(prompt: string, defaultAnswer = false): Promise<boolean> {
16
- blankLine();
17
- return inquire({ message: prompt, default: defaultAnswer });
18
- }
19
-
20
- /**
21
- * Ask the user to pick one of several choices, handing back the value behind
22
- * the one they picked. The caller decides the order the choices are shown in;
23
- * this only draws them.
24
- *
25
- * Whether a question may be asked at all is not decided here: that is
26
- * `isInteractive` in `src/lib/interactive.ts`, the one rule every prompt in
27
- * sous is gated by.
28
- *
29
- * @param prompt - The question to ask.
30
- * @param choices - The options, in the order they should be listed.
31
- */
32
- export async function askChoice<T>(
33
- prompt: string,
34
- choices: Array<{ name: string; value: T }>
35
- ): Promise<T> {
36
- blankLine();
37
- return select({ message: prompt, choices });
38
- }
39
-
40
- /**
41
- * Ask the user if they're sure they want to proceed.
42
- * @param prompt - An optional, custom, prompt to display to the user.
43
- */
44
- export async function areYouSure(prompt = "Are you SURE you want to proceed?"): Promise<void> {
45
- blankLine();
46
- const confirm = await inquire({ message: prompt });
47
- if (!confirm) {
48
- blankLine();
49
- log(color.redBright("Aborting."));
50
- blankLines();
51
- process.exit(0);
52
- }
53
- }
@@ -1,245 +0,0 @@
1
- /**
2
- * Self-describing directories.
3
- *
4
- * Sous creates a handful of directories for its own bookkeeping: the managed
5
- * config layers, linked checkouts, the machine-wide recipe cache, the user-level
6
- * sous directory itself. Somebody who finds one of them months later, or an
7
- * agent reading the repository for the first time, should be able to learn what
8
- * it is without leaving the directory.
9
- *
10
- * So every directory sous creates for itself gets three small files the first
11
- * time it is created:
12
- *
13
- * - `README.md`, a short plain-language explanation of what the directory is,
14
- * who writes to it, whether it may be edited or deleted, and whether it is
15
- * committed.
16
- * - `AGENTS.md` and `CLAUDE.md`, each a single line pointing at the README.
17
- *
18
- * None of the three is ever overwritten. A user who rewrites the README, or who
19
- * puts real instructions in `AGENTS.md`, keeps what they wrote forever.
20
- *
21
- * Rendered OUTPUT directories are deliberately NOT covered by this: what lands
22
- * in `.claude/skills/`, in a recipe's output destination, or anywhere else a
23
- * compilation target writes belongs to the user, and sous does not add files of
24
- * its own to it.
25
- */
26
-
27
- import fs from "node:fs";
28
- import path from "node:path";
29
- import { resolveSousHome } from "../lib/sous-home.js";
30
-
31
- /** The three files written into every sous-created directory. */
32
- export const README_FILENAME = "README.md";
33
-
34
- /** Agent instruction file names; both hold the same single pointer line. */
35
- export const AGENT_POINTER_FILENAMES = ["AGENTS.md", "CLAUDE.md"] as const;
36
-
37
- /** The one line both agent instruction files contain. */
38
- export const AGENT_POINTER_LINE = "Read `./README.md` for information about this directory.";
39
-
40
- /** The README text for a sous-created directory. */
41
- export type SousDirectoryReadme = {
42
- /** The heading, naming the directory in plain language. */
43
- title: string;
44
- /** One or more paragraphs of body text; blank lines are added between them. */
45
- body: string | string[];
46
- };
47
-
48
- /** Renders the README body into its final markdown text. */
49
- function renderReadme(readme: SousDirectoryReadme): string {
50
- const paragraphs = Array.isArray(readme.body) ? readme.body : [readme.body];
51
- return `# ${readme.title}\n\n${paragraphs.join("\n\n")}\n`;
52
- }
53
-
54
- /**
55
- * Writes a file only when it does not exist yet. The exclusive write flag makes
56
- * the check and the write one operation, so two sous processes racing to create
57
- * the same directory cannot overwrite each other. Any failure is swallowed: a
58
- * missing explanatory file is never a reason for a command to fail.
59
- *
60
- * @param filePath - Absolute path of the file to create.
61
- * @param contents - What to write when the file is absent.
62
- */
63
- function writeIfAbsent(filePath: string, contents: string): void {
64
- try {
65
- fs.writeFileSync(filePath, contents, { encoding: "utf8", flag: "wx" });
66
- } catch {
67
- // Already there, or not writable; either way there is nothing to do.
68
- }
69
- }
70
-
71
- /**
72
- * Creates one of sous's own bookkeeping directories and makes it
73
- * self-describing: `README.md` holding the given explanation, plus `AGENTS.md`
74
- * and `CLAUDE.md` pointing at it. Files that already exist are left exactly as
75
- * they are.
76
- *
77
- * Safe to call on every command; it is idempotent and cheap.
78
- *
79
- * @param directory - Absolute path of the directory to create.
80
- * @param readme - The explanation written into `README.md` on first creation.
81
- * @returns The directory path, so calls can be inlined.
82
- */
83
- export function ensureSousDirectory(
84
- directory: string,
85
- readme: SousDirectoryReadme
86
- ): string {
87
- fs.mkdirSync(directory, { recursive: true });
88
-
89
- writeIfAbsent(path.join(directory, README_FILENAME), renderReadme(readme));
90
- for (const name of AGENT_POINTER_FILENAMES) {
91
- writeIfAbsent(path.join(directory, name), `${AGENT_POINTER_LINE}\n`);
92
- }
93
-
94
- return directory;
95
- }
96
-
97
- // --- The directories sous creates for itself ----------------------------------------------------
98
- //
99
- // Each function below owns the wording for one directory, so every call site is a
100
- // single line and the same explanation is written no matter which command got
101
- // there first.
102
-
103
- /**
104
- * Ensures a project's `conf.d/` drop-in layer directory.
105
- *
106
- * @param directory - Absolute path to the project's `conf.d/` directory.
107
- */
108
- export function ensureConfdDirectory(directory: string): string {
109
- return ensureSousDirectory(directory, {
110
- title: "conf.d: drop-in configuration layers",
111
- body: [
112
- "Every `.js`, `.mjs`, `.json`, `.jsonc` or `.yaml` file directly inside this " +
113
- "directory is a configuration layer. Sous loads them after the project's main " +
114
- "`sous.config.*` file, in filename order, and merges each one over what came " +
115
- "before it.",
116
- "Layers numbered 500 through 599 are written by sous itself (for example " +
117
- "`500-repos.jsonc`, recording the repositories this project trusts). Sous edits " +
118
- "those files by key, so your comments, key order and formatting survive; it never " +
119
- "touches the main config or any layer outside that band.",
120
- "You may add, edit and delete layers here yourself, including the ones sous writes. " +
121
- "This directory is normally committed to version control along with the rest of " +
122
- "`.sous/`; keep machine-specific paths and secrets out of it and put them in " +
123
- "`.sous/.env.local` instead.",
124
- ],
125
- });
126
- }
127
-
128
- /**
129
- * Ensures a project's `.sous/repos/` directory of linked checkouts.
130
- *
131
- * @param directory - Absolute path to the project's `repos/` directory.
132
- */
133
- export function ensureProjectReposDirectory(directory: string): string {
134
- return ensureSousDirectory(directory, {
135
- title: "repos: linked repository checkouts",
136
- body: [
137
- "`sous repo link` clones a recipe repository in here so you can work on it and on " +
138
- "this project at the same time. Each checkout is an ordinary git working copy; " +
139
- "sous reads from it and never writes to it.",
140
- "Everything here is machine-local. The `.gitignore` beside this file holds a single " +
141
- "`*`, so nothing in this directory (these explanatory files included) is visible " +
142
- "to the project's own repository.",
143
- "It is safe to delete a checkout once you have run `sous repo unlink` for it; sous " +
144
- "goes back to the published version of that repository.",
145
- ],
146
- });
147
- }
148
-
149
- /**
150
- * Ensures the user-level sous directory, `$SOUS_HOME` (`~/.sous` by default).
151
- *
152
- * @param directory - Absolute path to the user-level sous directory.
153
- */
154
- export function ensureSousHomeDirectory(directory: string): string {
155
- return ensureSousDirectory(directory, {
156
- title: "Your user-level sous directory",
157
- body: [
158
- "This is `$SOUS_HOME` (`~/.sous` unless you set that variable). It holds the sous " +
159
- "state that belongs to this machine rather than to any one project: the recipe " +
160
- "cache in `cache/`, globally linked checkouts in `repos/`, and the machine-wide " +
161
- "links map `sous.links.json`.",
162
- "No project reads its configuration from here, and nothing in here is committed " +
163
- "anywhere. Sous recreates whatever it needs, so you can delete any of it; you " +
164
- "will lose only cached downloads and the record of which repositories you linked " +
165
- "globally.",
166
- ],
167
- });
168
- }
169
-
170
- /**
171
- * Explains the parent directory too, but ONLY when it really is the user-level
172
- * sous directory. A store rooted somewhere else (a test fixture, a root somebody
173
- * pointed at by hand) must never leave explanatory files in a directory sous
174
- * does not own, such as the system temporary directory.
175
- *
176
- * @param directory - The child directory whose parent is being considered.
177
- */
178
- function ensureParentWhenSousHome(directory: string): void {
179
- const parent = path.resolve(path.dirname(directory));
180
- if (parent !== path.resolve(resolveSousHome())) return;
181
- ensureSousHomeDirectory(parent);
182
- }
183
-
184
- /**
185
- * Ensures the machine-wide recipe store root, `$SOUS_HOME/cache/`.
186
- *
187
- * @param directory - Absolute path to the store root.
188
- */
189
- export function ensureStoreRootDirectory(directory: string): string {
190
- ensureParentWhenSousHome(directory);
191
- return ensureSousDirectory(directory, {
192
- title: "cache: the machine-wide recipe store",
193
- body: [
194
- "Sous downloads every recipe version it needs into this directory, one immutable " +
195
- "folder per version, and verifies each one against its content hash before using " +
196
- "it. Builds read from here, so a version is downloaded once and shared by every " +
197
- "project on this machine.",
198
- "The store is disposable. Everything in it can be fetched again from the pins in " +
199
- "each project's lockfile, so you may delete any part of it at any time; " +
200
- "`sous repo gc` does the same thing tidily. Nothing here is committed, and " +
201
- "editing a stored file only makes sous discard the entry as corrupted.",
202
- ],
203
- });
204
- }
205
-
206
- /**
207
- * Ensures the machine-wide directory of globally linked checkouts,
208
- * `$SOUS_HOME/repos/`.
209
- *
210
- * @param directory - Absolute path to the global repos directory.
211
- */
212
- export function ensureGlobalReposDirectory(directory: string): string {
213
- ensureParentWhenSousHome(directory);
214
- return ensureSousDirectory(directory, {
215
- title: "repos: globally linked repository checkouts",
216
- body: [
217
- "`sous repo link --global` clones a recipe repository in here, where every project " +
218
- "on this machine can use the same checkout. Each one is an ordinary git working " +
219
- "copy; sous reads from it and never writes to it.",
220
- "Everything here is machine-local and is not committed anywhere. It is safe to " +
221
- "delete a checkout once no project links to it any more; sous goes back to the " +
222
- "published version of that repository.",
223
- ],
224
- });
225
- }
226
-
227
- /**
228
- * Ensures the cached repository index directory, `$SOUS_HOME/cache/_indexes/`.
229
- *
230
- * @param directory - Absolute path to the index cache directory.
231
- */
232
- export function ensureIndexCacheDirectory(directory: string): string {
233
- ensureStoreRootDirectory(path.dirname(directory));
234
- return ensureSousDirectory(directory, {
235
- title: "_indexes: cached repository indexes",
236
- body: [
237
- "Each repository sous knows about publishes one small index file listing the " +
238
- "recipes and versions it offers. Sous keeps a copy of each here, beside a " +
239
- "`.meta.json` sidecar recording when that copy was fetched.",
240
- "Sous writes these files; there is nothing here to edit. Deleting any of them is " +
241
- "safe and costs only a refetch the next time the repository is consulted. Nothing " +
242
- "here is committed.",
243
- ],
244
- });
245
- }