paperlint 10.4.0 → 10.4.1

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 (111) hide show
  1. package/dist/CLAUDE.md.spec.d.ts.map +1 -1
  2. package/dist/CLAUDE.md.spec.js +6 -3
  3. package/dist/CLAUDE.md.spec.js.map +1 -1
  4. package/dist/adapters/latex/captions.d.ts +9 -0
  5. package/dist/adapters/latex/captions.d.ts.map +1 -0
  6. package/dist/adapters/latex/captions.js +40 -0
  7. package/dist/adapters/latex/captions.js.map +1 -0
  8. package/dist/adapters/latex/index.d.ts +1 -0
  9. package/dist/adapters/latex/index.d.ts.map +1 -1
  10. package/dist/adapters/latex/index.js +1 -0
  11. package/dist/adapters/latex/index.js.map +1 -1
  12. package/dist/adapters/latex/parse.d.ts.map +1 -1
  13. package/dist/adapters/latex/parse.js +6 -0
  14. package/dist/adapters/latex/parse.js.map +1 -1
  15. package/dist/adapters/node/list-entries.io.d.ts.map +1 -1
  16. package/dist/adapters/node/list-entries.io.js +3 -1
  17. package/dist/adapters/node/list-entries.io.js.map +1 -1
  18. package/dist/domain/decide-first.d.ts +11 -1
  19. package/dist/domain/decide-first.d.ts.map +1 -1
  20. package/dist/domain/decide-first.js +6 -0
  21. package/dist/domain/decide-first.js.map +1 -1
  22. package/dist/domain/index-columns.d.ts.map +1 -1
  23. package/dist/domain/index-columns.js +2 -0
  24. package/dist/domain/index-columns.js.map +1 -1
  25. package/dist/domain/study-registry.d.ts +65 -8
  26. package/dist/domain/study-registry.d.ts.map +1 -1
  27. package/dist/domain/study-registry.js +63 -19
  28. package/dist/domain/study-registry.js.map +1 -1
  29. package/dist/outputs-before-decision-rule.d.ts +1 -1
  30. package/dist/outputs-before-decision-rule.d.ts.map +1 -1
  31. package/dist/outputs-before-decision-rule.js +21 -17
  32. package/dist/outputs-before-decision-rule.js.map +1 -1
  33. package/dist/ports/list-entries.d.ts +7 -4
  34. package/dist/ports/list-entries.d.ts.map +1 -1
  35. package/dist/ports/study-deps.d.ts +14 -0
  36. package/dist/ports/study-deps.d.ts.map +1 -0
  37. package/dist/ports/study-deps.js +2 -0
  38. package/dist/ports/study-deps.js.map +1 -0
  39. package/dist/ports/study-folder.d.ts +43 -0
  40. package/dist/ports/study-folder.d.ts.map +1 -0
  41. package/dist/ports/study-folder.js +2 -0
  42. package/dist/ports/study-folder.js.map +1 -0
  43. package/dist/presets.d.ts +1 -2
  44. package/dist/presets.d.ts.map +1 -1
  45. package/dist/presets.js +1 -2
  46. package/dist/presets.js.map +1 -1
  47. package/dist/studies.d.ts.map +1 -1
  48. package/dist/studies.js +10 -7
  49. package/dist/studies.js.map +1 -1
  50. package/dist/study-folder.d.ts +14 -0
  51. package/dist/study-folder.d.ts.map +1 -0
  52. package/dist/study-folder.js +123 -0
  53. package/dist/study-folder.js.map +1 -0
  54. package/dist/study-gate.d.ts +1 -1
  55. package/dist/study-gate.d.ts.map +1 -1
  56. package/dist/study-gate.js +65 -28
  57. package/dist/study-gate.js.map +1 -1
  58. package/dist/study-index-input.d.ts +1 -1
  59. package/dist/study-index-input.d.ts.map +1 -1
  60. package/dist/study-index-input.js +8 -3
  61. package/dist/study-index-input.js.map +1 -1
  62. package/dist/study-modes.d.ts +38 -27
  63. package/dist/study-modes.d.ts.map +1 -1
  64. package/dist/study-modes.js +42 -53
  65. package/dist/study-modes.js.map +1 -1
  66. package/dist/study-registry-rule.d.ts +2 -6
  67. package/dist/study-registry-rule.d.ts.map +1 -1
  68. package/dist/study-registry-rule.js +32 -41
  69. package/dist/study-registry-rule.js.map +1 -1
  70. package/docs/design/study-modes.md +46 -28
  71. package/docs/rules/repro/outputs-before-decision.md +3 -0
  72. package/docs/rules/repro/study-registered.md +3 -2
  73. package/docs/rules/tex/heading-case.md +1 -1
  74. package/eslint.config.mjs +36 -24
  75. package/package.json +1 -1
  76. package/skills/grade-paper-writing/SKILL.md +4 -2
  77. package/skills/grade-paper-writing/SKILL.md.spec.ts +3 -1
  78. package/skills/grade-paper-writing/__snapshots__/prose-lint.test.ts.snap +16 -3
  79. package/skills/grade-paper-writing/prose-lint.mjs +127 -95
  80. package/skills/grade-paper-writing/prose-lint.test.ts +119 -10
  81. package/src/CLAUDE.md +7 -4
  82. package/src/CLAUDE.md.spec.ts +6 -3
  83. package/src/adapters/latex/captions.test.ts +57 -0
  84. package/src/adapters/latex/captions.ts +56 -0
  85. package/src/adapters/latex/index.ts +1 -0
  86. package/src/adapters/latex/parse.ts +7 -0
  87. package/src/adapters/node/list-entries.io.ts +2 -1
  88. package/src/adapters/node/list-entries.test.ts +18 -0
  89. package/src/domain/decide-first.test.ts +33 -0
  90. package/src/domain/decide-first.ts +16 -1
  91. package/src/domain/index-columns.test.ts +49 -4
  92. package/src/domain/index-columns.ts +2 -0
  93. package/src/domain/study-measurements.test.ts +7 -3
  94. package/src/domain/study-registry.test.ts +34 -6
  95. package/src/domain/study-registry.ts +123 -31
  96. package/src/outputs-before-decision-rule.test.ts +47 -2
  97. package/src/outputs-before-decision-rule.ts +31 -22
  98. package/src/ports/list-entries.ts +7 -4
  99. package/src/ports/study-deps.ts +14 -0
  100. package/src/ports/study-folder.ts +38 -0
  101. package/src/presets.ts +1 -2
  102. package/src/studies-index-modes.test.ts +2 -2
  103. package/src/studies.ts +19 -10
  104. package/src/study-folder.test.ts +237 -0
  105. package/src/study-folder.ts +176 -0
  106. package/src/study-gate.test.ts +158 -7
  107. package/src/study-gate.ts +127 -54
  108. package/src/study-index-input.ts +12 -4
  109. package/src/study-modes.ts +67 -80
  110. package/src/study-registry-rule.test.ts +87 -0
  111. package/src/study-registry-rule.ts +58 -66
@@ -1 +1 @@
1
- {"version":3,"file":"studies.d.ts","sourceRoot":"","sources":["../src/studies.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAIrD,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEnE,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,QAAQ,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AAsPD,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,CAWpE"}
1
+ {"version":3,"file":"studies.d.ts","sourceRoot":"","sources":["../src/studies.ts"],"names":[],"mappings":"AAuCA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAKrD,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAEnE,gEAAgE;AAChE,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,CAAC;IACtC,wDAAwD;IACxD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,QAAQ,CAAC;IACpC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;IACnC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,qDAAqD;IACrD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACtC;AA4PD,sFAAsF;AACtF,wBAAgB,UAAU,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,GAAG,MAAM,CAWpE"}
package/dist/studies.js CHANGED
@@ -16,10 +16,12 @@
16
16
  * registry is refused with the file to write rather than given a guessed one.
17
17
  */
18
18
  import { join, relative, resolve } from "node:path";
19
+ import { find, map, pipe } from "remeda";
19
20
  import { callerPath } from "./caller-path.js";
20
21
  import { README, REPRO_DIR } from "./domain/repro-layout.js";
21
22
  import { DEFAULT_KIND, PLAN_FILE, STUDIES_FILE, STUDY_KINDS, addStudy, indexCurrent, isStudyKind, planTemplate, planText, registryText, studyReadme, withIndex, } from "./domain/study-registry.js";
22
- import { readableFolders, registryOf } from "./study-registry-rule.js";
23
+ import { registryOf } from "./study-registry-rule.js";
24
+ import { folderRefusalText, studyFolder } from "./study-folder.js";
23
25
  import { runGate } from "./study-gate.js";
24
26
  import { indexInputOf } from "./study-index-input.js";
25
27
  const NEW_USAGE = 'npx paperlint studies new <paper-dir> "<title>" [--kind <kind>]';
@@ -41,13 +43,14 @@ function registryIn(p, deps) {
41
43
  return escaping(p, r.registry, deps) ?? r.registry;
42
44
  }
43
45
  }
44
- /** The refusal when a row names a folder that is not one inside `repro/`; null when none does. */
46
+ /** The refusal when a row names a folder that may not be entered; null when none does. */
45
47
  function escaping(p, r, deps) {
46
- const readable = readableFolders(p.dir, deps);
47
- const s = r.studies.find((row) => !readable(row.folder));
48
- return s === undefined
49
- ? null
50
- : refuse(1, `${s.id} in ${p.shown}/${REPRO_DIR}/${STUDIES_FILE} names the folder \`${s.folder}\`, which is not one folder inside ${REPRO_DIR}/: nothing is read or written through it. Give the row its own folder's name, then run this again.`);
48
+ const folder = studyFolder(p.dir, deps);
49
+ const found = pipe(r.studies, map((row) => ({ row, why: folder.refusal(row.folder) })), find((x) => x.why !== null));
50
+ if (found === undefined)
51
+ return null;
52
+ const { reason, fix } = folderRefusalText(found.why, p.shown);
53
+ return refuse(1, `${found.row.id} in ${p.shown}/${REPRO_DIR}/${STUDIES_FILE} names the folder \`${found.row.folder}\`, which ${reason}: nothing is read or written through it. ${fix}, then run this again.`);
51
54
  }
52
55
  const isRefusal = (v) => typeof v === "object" && v !== null && "code" in v && "line" in v;
53
56
  const text = (s) => new TextEncoder().encode(s);
@@ -1 +1 @@
1
- {"version":3,"file":"studies.js","sourceRoot":"","sources":["../src/studies.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC7D,OAAO,EACL,YAAY,EACZ,SAAS,EACT,YAAY,EACZ,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,YAAY,EACZ,QAAQ,EACR,YAAY,EACZ,WAAW,EACX,SAAS,GAIV,MAAM,4BAA4B,CAAC;AAKpC,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AA4BtD,MAAM,SAAS,GACb,iEAAiE,CAAC;AACpE,MAAM,WAAW,GAAG,yCAAyC,CAAC;AAC9D,MAAM,UAAU,GAAG,6CAA6C,CAAC;AACjE,MAAM,IAAI,GAAG,wBAAwB,CAAC,SAAS,EAAE,WAAW,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAExF,MAAM,WAAW,GAAG,oBAAoB,CAAC;AAWzC,MAAM,MAAM,GAAG,CAAC,IAAW,EAAE,IAAY,EAAW,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAExE,wFAAwF;AACxF,SAAS,UAAU,CAAC,CAAQ,EAAE,IAAiB;IAC7C,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,SAAS,IAAI,YAAY,EAAE,CAAC;IACvD,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;QACf,KAAK,QAAQ;YACX,OAAO,MAAM,CACX,CAAC,EACD,GAAG,IAAI,sMAAsM,CAC9M,CAAC;QACJ,KAAK,YAAY;YACf,OAAO,MAAM,CAAC,CAAC,EAAE,GAAG,IAAI,6BAA6B,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;QAChE,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC;IACvD,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,SAAS,QAAQ,CACf,CAAQ,EACR,CAAgB,EAChB,IAAiB;IAEjB,MAAM,QAAQ,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;IACzD,OAAO,CAAC,KAAK,SAAS;QACpB,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,MAAM,CACJ,CAAC,EACD,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,KAAK,IAAI,SAAS,IAAI,YAAY,uBAAuB,CAAC,CAAC,MAAM,sCAAsC,SAAS,oGAAoG,CACrO,CAAC;AACR,CAAC;AAED,MAAM,SAAS,GAAG,CAAC,CAAU,EAAgB,EAAE,CAC7C,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC;AAEpE,MAAM,IAAI,GAAG,CAAC,CAAS,EAAc,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AAEpE,kDAAkD;AAClD,MAAM,QAAQ,GAAG,CAAC,GAAW,EAAE,KAAY,EAAiB,EAAE;IAC5D,MAAM,CAAC,GAAG,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;AACzD,CAAC,CAAC;AAEF,MAAM,YAAY,GAAG,CAAC,CAAgB,EAAU,EAAE,CAChD,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC;AAEhF;;;GAGG;AACH,SAAS,UAAU,CAAC,GAAW,EAAE,CAAgB,EAAE,IAAiB;IAClE,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACzC,MAAM,EAAE,GAAG,YAAY,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAClE,IAAI,YAAY,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAAE,OAAO,KAAK,CAAC;IAC9C,IAAI,CAAC,KAAK,CAAC,WAAW,CACpB,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,EACxC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAC/B,CAAC;IACF,OAAO,IAAI,CAAC;AACd,CAAC;AAED,uGAAuG;AACvG,SAAS,aAAa,CAAC,CAAQ,EAAE,IAAiB;IAChD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAChE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;IACxD,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC;QACxD,CAAC,CAAC,MAAM,CACJ,CAAC,EACD,GAAG,CAAC,CAAC,KAAK,IAAI,SAAS,IAAI,MAAM,qFAAqF,CACvH;QACH,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAED,yEAAyE;AACzE,SAAS,QAAQ,CACf,CAAQ,EACR,CAAc,EACd,IAAiB;IAEjB,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IAC5E,IAAI,OAAO,KAAK,SAAS;QACvB,OAAO,MAAM,CACX,CAAC,EACD,mDAAmD,OAAO,6BAA6B,CACxF,CAAC;IACJ,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9B,IAAI,SAAS,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACvC,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC;IACrC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,SAAS,IAAI,MAAM,EAAE,CAAC;IACnD,OAAO;QACL,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,IAAI,CAAC;YACxB,CAAC,CAAC,sBAAsB,YAAY,CAAC,CAAC,CAAC,OAAO,MAAM,EAAE;YACtD,CAAC,CAAC,gBAAgB,MAAM,oBAAoB,YAAY,CAAC,CAAC,CAAC,EAAE;KAChE,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,SAAS,OAAO,CACd,CAAc;IAEd,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;QACvB,OAAO,MAAM,CAAC,CAAC,EAAE,wCAAwC,SAAS,EAAE,CAAC,CAAC;IACxE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAC1B,IAAI,OAAO,KAAK,SAAS;QACvB,OAAO,MAAM,CACX,CAAC,EACD,0DAA0D,OAAO,8DAA8D,CAChI,CAAC;IACJ,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,IAAI,YAAY,CAAC;IACpC,OAAO,WAAW,CAAC,IAAI,CAAC;QACtB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE;QAC1B,CAAC,CAAC,MAAM,CACJ,CAAC,EACD,UAAU,IAAI,mCAAmC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAC1E,CAAC;AACR,CAAC;AAED,uGAAuG;AACvG,SAAS,UAAU,CACjB,CAAQ,EACR,KAAkE,EAClE,IAAiB;IAEjB,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC;IAClC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;IACvB,MAAM,EAAE,GAAG,CAAC,GAAG,KAAwB,EAAgB,EAAE,CACvD,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC;IAC/C,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtE,KAAK,CAAC,WAAW,CACf,EAAE,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,EAC3B,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CACvD,CAAC;IACF,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClE,UAAU,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAClC,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,KAAK,IAAI,SAAS,EAAE,CAAC;IACxC,OAAO;QACL,WAAW,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM,EAAE;QAC5C,WAAW,KAAK,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS,0EAA0E;QACvH,SAAS,KAAK,CAAC,EAAE,OAAO,KAAK,IAAI,YAAY,UAAU,KAAK,CAAC,IAAI,YAAY,KAAK,CAAC,MAAM,KAAK,KAAK,CAAC,IAAI,EAAE;QAC1G,sBAAsB,YAAY,CAAC,QAAQ,CAAC,OAAO,KAAK,IAAI,MAAM,EAAE;QACpE,+NAA+N,CAAC,CAAC,KAAK,KAAK;KAC5O,CAAC;AACJ,CAAC;AAED,oEAAoE;AACpE,SAAS,MAAM,CACb,CAAQ,EACR,CAAc,EACd,IAAiB;IAEjB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IACxB,IAAI,SAAS,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,MAAM,CAAC,GAAG,UAAU,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC9B,IAAI,SAAS,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3B,MAAM,OAAO,GAAG,aAAa,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IACvC,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,OAAO,CAAC;IACrC,MAAM,KAAK,GAAG,QAAQ,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,KAAK,CAAC,EAAE;QAAE,OAAO,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;IAClC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC;QACtE,CAAC,CAAC,MAAM,CACJ,CAAC,EACD,GAAG,CAAC,CAAC,KAAK,IAAI,SAAS,IAAI,MAAM,kGAAkG,CACpI;QACH,CAAC,CAAC,UAAU,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;AACjC,CAAC;AAED,+DAA+D;AAC/D,SAAS,OAAO,CAAC,CAAc,EAAE,IAAiB;IAChD,IAAI,CAAC,CAAC,GAAG,KAAK,SAAS;QACrB,OAAO,MAAM,CAAC,CAAC,EAAE,+BAA+B,IAAI,EAAE,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAChC,IAAI,GAAG,KAAK,SAAS;QACnB,OAAO,MAAM,CAAC,CAAC,EAAE,gCAAgC,CAAC,CAAC,GAAG,OAAO,IAAI,EAAE,CAAC,CAAC;IACvE,IAAI,CAAC,CAAC,QAAQ,KAAK,SAAS;QAC1B,OAAO,MAAM,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,GAAG,8BAA8B,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC;IAC9E,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG,CAAC;IAC7C,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE;QAC9B,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,KAAK,qCAAqC,WAAW,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,2DAA2D;AAC3D,MAAM,OAAO,GAAG,CACd,CAAQ,EACR,CAAc,EACd,IAAiB,EACY,EAAE;IAC/B,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS;QACvB,OAAO,MAAM,CAAC,CAAC,EAAE,sCAAsC,UAAU,EAAE,CAAC,CAAC;IACvE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAC1B,IAAI,OAAO,KAAK,SAAS;QACvB,OAAO,MAAM,CACX,CAAC,EACD,wDAAwD,OAAO,6BAA6B,CAC7F,CAAC;IACJ,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACnD,OAAO,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;AAC1C,CAAC,CAAC;AAcF,mDAAmD;AACnD,MAAM,QAAQ,GAGV,IAAI,GAAG,CAAC;IACV,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;IAC1C,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;IAChD,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;CAC9C,CAAC,CAAC;AAEH,sFAAsF;AACtF,MAAM,UAAU,UAAU,CAAC,CAAc,EAAE,IAAiB;IAC1D,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC;IACjD,IAAI,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;QACnB,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,GAAG,CAAC,IAAI,CAAC;IAClB,CAAC;IACD,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACnB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,CAAC;AACX,CAAC"}
1
+ {"version":3,"file":"studies.js","sourceRoot":"","sources":["../src/studies.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import type { Files } from "./ports/files.ts";
2
+ import type { ListEntries } from "./ports/list-entries.ts";
3
+ import type { FolderRefusal, StudyFolder } from "./ports/study-folder.ts";
4
+ /** What a refusal says of the folder a row names: `which <reason>`, and the fix without its full stop. */
5
+ export declare const folderRefusalText: (why: FolderRefusal, shown: string) => {
6
+ readonly reason: string;
7
+ readonly fix: string;
8
+ };
9
+ /** The reader of the study folders of the paper folder `paper`. */
10
+ export declare const studyFolder: (paper: string, deps: {
11
+ readonly files: Files;
12
+ readonly entries: ListEntries;
13
+ }) => StudyFolder;
14
+ //# sourceMappingURL=study-folder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"study-folder.d.ts","sourceRoot":"","sources":["../src/study-folder.ts"],"names":[],"mappings":"AA6BA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAY,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EACV,aAAa,EAEb,WAAW,EACZ,MAAM,yBAAyB,CAAC;AAEjC,0GAA0G;AAC1G,eAAO,MAAM,iBAAiB,GAC5B,KAAK,aAAa,EAClB,OAAO,MAAM,KACZ;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAS3C,CAAC;AAoGR,mEAAmE;AACnE,eAAO,MAAM,WAAW,GACtB,OAAO,MAAM,EACb,MAAM;IAAE,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAA;CAAE,KAC7D,WAqBD,CAAC"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * The one reader of what lies inside a study's folder, `repro/<folder>/<path>`, and of the decision
3
+ * file that lies elsewhere in the paper. It never follows a symbolic link: a path is walked one
4
+ * component at a time by the entries of each directory (`ListEntries`, which does not follow links),
5
+ * and a path that passes through a link — the file itself, or any directory above it — is `linked`,
6
+ * naming the link, before a single byte is read. Every reader of a study takes a `StudyFolder` and
7
+ * not `Files`, so a read that follows a link is not what those readers are handed.
8
+ *
9
+ * What goes through it, and who builds it (once per run, from the paper's folder):
10
+ * - the plan of a row: `repro/study-registered`, `repro/outputs-before-decision`, `studies gate`
11
+ * and the index's mode columns;
12
+ * - the result file of a row: `repro/study-registered`;
13
+ * - whether a row's folder may be entered at all (`refusal`): `studies gate`, `studies index|new`;
14
+ * - the decision file's path (`entryAt`): the gate and the order rule.
15
+ * The outputs of a study are listed through it too (`list`).
16
+ * A study folder that is itself a link, or a folder name that is not one folder inside `repro/`, is
17
+ * never entered: its files read as `absent`.
18
+ *
19
+ * A link made between the walk and the read is not caught: paperlint guards against accidents, not
20
+ * against an author who races their own tooling (docs/design/study-modes.md, the threat model).
21
+ */
22
+ import { join, posix } from "node:path";
23
+ import { callerPath } from "./caller-path.js";
24
+ import { REPRO_DIR } from "./domain/repro-layout.js";
25
+ import { isFolderName, isInside, } from "./domain/study-registry.js";
26
+ /** What a refusal says of the folder a row names: `which <reason>`, and the fix without its full stop. */
27
+ export const folderRefusalText = (why, shown) => why === "not-a-folder"
28
+ ? {
29
+ reason: `is not one folder inside ${shown}/${REPRO_DIR}/`,
30
+ fix: "Give the row its own folder's name",
31
+ }
32
+ : {
33
+ reason: "is a symbolic link",
34
+ fix: `Give the row a real folder inside ${shown}/${REPRO_DIR}/`,
35
+ };
36
+ /** What the entry `name` of the directory `dir` is; undefined when there is none. */
37
+ const kindAt = (entries, dir, name) => entries(callerPath(dir)).find((e) => e.name === name)?.kind;
38
+ const ENTRY = {
39
+ file: { kind: "file" },
40
+ dir: { kind: "dir" },
41
+ other: { kind: "other" },
42
+ };
43
+ /**
44
+ * What the entry `name` below `dir`/`above` is: every component on the way is looked up in its
45
+ * directory's entries, and the first that is a symbolic link ends the walk (an entry under a
46
+ * directory that is not there is not listed, so it can be no link).
47
+ */
48
+ const walk = (dir, above, name, entries) => {
49
+ const path = [...above, name];
50
+ const at = path.findIndex((c, i) => kindAt(entries, join(dir, ...path.slice(0, i)), c) === "symlink");
51
+ if (at >= 0)
52
+ return { kind: "linked", link: path.slice(0, at + 1).join("/") };
53
+ const kind = kindAt(entries, join(dir, ...above), name);
54
+ return kind === undefined || kind === "symlink"
55
+ ? { kind: "absent" }
56
+ : ENTRY[kind];
57
+ };
58
+ /** `path` as the directories above its last component, and that component. */
59
+ const split = (path) => {
60
+ const normal = posix.normalize(path);
61
+ return {
62
+ above: posix
63
+ .dirname(normal)
64
+ .split("/")
65
+ .filter((c) => c !== "."),
66
+ name: posix.basename(normal),
67
+ };
68
+ };
69
+ /** What `path` in `folder` is, by the entries of the paper folder `paper`; nothing is read. */
70
+ const locateIn = (paper, entries, folder, path) => {
71
+ // A NUL is no path the disk can hold, and probing one throws; the rest never leaves the folder.
72
+ if (!isFolderName(folder) || !isInside(path) || path.includes("\0"))
73
+ return { kind: "absent" };
74
+ const { above, name } = split(path);
75
+ // The folder is walked too: one that is a link is never entered, and reads as absent.
76
+ const found = walk(join(paper, REPRO_DIR), [folder, ...above], name, entries);
77
+ // A directory or a special file is no file to read: it reads as nothing.
78
+ if (found.kind === "dir" || found.kind === "other")
79
+ return { kind: "absent" };
80
+ if (found.kind !== "linked")
81
+ return found;
82
+ return found.link === folder
83
+ ? { kind: "absent" }
84
+ : { kind: "linked", link: found.link.slice(folder.length + 1) };
85
+ };
86
+ /** Why `folder` may not be entered in the paper folder `paper`; null when it may. */
87
+ const refusalOf = (paper, entries, folder) => {
88
+ if (!isFolderName(folder))
89
+ return "not-a-folder";
90
+ return kindAt(entries, join(paper, REPRO_DIR), folder) === "symlink"
91
+ ? "symbolic-link"
92
+ : null;
93
+ };
94
+ /** Every file under `dir`, relative to it; a link is a file, and is not entered. */
95
+ const filesUnder = (dir, entries, prefix = "") => entries(callerPath(dir)).flatMap(({ name, kind }) => {
96
+ const rel = prefix === "" ? name : `${prefix}/${name}`;
97
+ return kind === "dir" ? filesUnder(join(dir, name), entries, rel) : [rel];
98
+ });
99
+ /** The reader of the study folders of the paper folder `paper`. */
100
+ export const studyFolder = (paper, deps) => ({
101
+ refusal: (folder) => refusalOf(paper, deps.entries, folder),
102
+ locate: (folder, path) => locateIn(paper, deps.entries, folder, path),
103
+ read: (folder, path) => {
104
+ const at = locateIn(paper, deps.entries, folder, path);
105
+ if (at.kind !== "file")
106
+ return at;
107
+ const p = callerPath(join(paper, REPRO_DIR, folder, path));
108
+ const bytes = deps.files.isFile(p) ? deps.files.readBytes(p) : null;
109
+ return bytes === null
110
+ ? { kind: "absent" }
111
+ : { kind: "text", text: new TextDecoder().decode(bytes) };
112
+ },
113
+ list: (folder) => refusalOf(paper, deps.entries, folder) === null
114
+ ? filesUnder(join(paper, REPRO_DIR, folder), deps.entries)
115
+ : [],
116
+ entryAt: (path) => {
117
+ if (!isInside(path) || path.includes("\0"))
118
+ return { kind: "absent" };
119
+ const { above, name } = split(path);
120
+ return walk(paper, above, name, deps.entries);
121
+ },
122
+ });
123
+ //# sourceMappingURL=study-folder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"study-folder.js","sourceRoot":"","sources":["../src/study-folder.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { type StudyDeps } from "./study-modes.ts";
2
1
  import type { Committed, GitHistory } from "./ports/git-history.ts";
2
+ import type { StudyDeps } from "./ports/study-deps.ts";
3
3
  import { type StudyRun } from "./study-run.ts";
4
4
  export interface GateDeps extends StudyDeps {
5
5
  readonly git: GitHistory;
@@ -1 +1 @@
1
- {"version":3,"file":"study-gate.d.ts","sourceRoot":"","sources":["../src/study-gate.ts"],"names":[],"mappings":"AAYA,OAAO,EAIL,KAAK,SAAS,EACf,MAAM,kBAAkB,CAAC;AAI1B,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEpE,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,QAAS,SAAQ,SAAS;IACzC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;CAC1B;AAoBD,2DAA2D;AAC3D,eAAO,MAAM,QAAQ,GACnB,IAAI,MAAM,EACV,MAAM,MAAM,EACZ,GAAG,SAAS,KACX;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAMA,CAAC;AAwEnD,4EAA4E;AAC5E,wBAAgB,OAAO,CACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,QAAQ,GACb,QAAQ,CAmBV"}
1
+ {"version":3,"file":"study-gate.d.ts","sourceRoot":"","sources":["../src/study-gate.ts"],"names":[],"mappings":"AAuBA,OAAO,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGpE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,EAIL,KAAK,QAAQ,EACd,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,QAAS,SAAQ,SAAS;IACzC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;CAC1B;AAoBD,2DAA2D;AAC3D,eAAO,MAAM,QAAQ,GACnB,IAAI,MAAM,EACV,MAAM,MAAM,EACZ,GAAG,SAAS,KACX;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAMA,CAAC;AAgJnD,4EAA4E;AAC5E,wBAAgB,OAAO,CACrB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,QAAQ,GACb,QAAQ,CAeV"}
@@ -6,14 +6,17 @@
6
6
  * npx paperlint studies gate papers/my-paper P1-S03 && ./run.sh
7
7
  *
8
8
  * An exploratory study has no gate: it exits 0 and says so. A study that declares no mode, names no
9
- * decision file, or whose row names a folder that is not one inside `repro/`, is refused.
9
+ * decision file, whose row names a folder that is not one inside `repro/`, or whose id two rows
10
+ * share, is refused.
10
11
  */
11
12
  import { join } from "node:path";
12
13
  import { callerPath } from "./caller-path.js";
13
- import { modeStudies, onDisk, } from "./study-modes.js";
14
+ import { decisionEntry, readModeStudy } from "./study-modes.js";
14
15
  import { REPRO_DIR } from "./domain/repro-layout.js";
15
16
  import { decisionAsOutput } from "./domain/study-mode.js";
16
- import { readableFolders, registryOf } from "./study-registry-rule.js";
17
+ import { STUDIES_FILE, studiesOf, studyById, } from "./domain/study-registry.js";
18
+ import { folderRefusalText, studyFolder } from "./study-folder.js";
19
+ import { registryOf } from "./study-registry-rule.js";
17
20
  import { refusal, refused, } from "./study-run.js";
18
21
  /** The line of a committed state that holds the run back. */
19
22
  const shutLine = (id, file, c) => {
@@ -39,57 +42,91 @@ export const gateLine = (id, file, c) => c.kind === "committed"
39
42
  * Why the decision cannot gate the run though it is named: its own outputs match it, or it is a
40
43
  * directory (git answers for a directory with the last commit of anything under it); null when usable.
41
44
  */
42
- const unusable = (paper, { id, folder }, mode, deps) => {
45
+ const unusable = ({ id, folder: studyDir }, mode, folder) => {
43
46
  const file = mode.decision.file;
44
- const glob = decisionAsOutput(folder, mode);
47
+ const glob = decisionAsOutput(studyDir, mode);
45
48
  if (glob !== null)
46
49
  return refusal(`${id}: its decision ${file} is matched by its output \`${glob}\`; a decision cannot be what its own run produces.`);
47
- const on = onDisk(join(paper, file), deps);
48
- return on === "directory" || on === "symbolic link"
49
- ? refusal(`${id}: its decision ${file} is a ${on}, not a file; the run cannot be gated on it. Name the decision file in \`mode.decision.file\`.`)
50
- : null;
50
+ const on = decisionEntry(folder, file);
51
+ switch (on.kind) {
52
+ case "not-a-file":
53
+ return refusal(`${id}: its decision ${file} is a ${on.what}, not a file; the run cannot be gated on it. Name the decision file in \`mode.decision.file\`.`);
54
+ case "linked":
55
+ return refusal(`${id}: its decision ${file} passes through the symbolic link \`${on.link}\`; git records the link, not the files behind it, so the run cannot be gated on it. Name a decision file that lies in real directories in \`mode.decision.file\`.`);
56
+ case "ok":
57
+ return null;
58
+ }
51
59
  };
52
60
  /** The gate of a decide-first study. */
53
- const gateDecided = (paper, { id, folder }, mode, deps) => {
61
+ const gateDecided = ({ paper, folder, deps }, row, mode) => {
62
+ const { id } = row;
54
63
  const file = mode.decision.file;
55
- const blocked = unusable(paper, { id, folder }, mode, deps);
64
+ const blocked = unusable(row, mode, folder);
56
65
  if (blocked !== null)
57
66
  return refused(blocked);
58
67
  const g = gateLine(id, file, deps.git.committed(callerPath(paper), callerPath(join(paper, file))));
59
68
  return g.open ? { ok: true, lines: [g.line] } : refused(refusal(g.line));
60
69
  };
61
- /** The refusal when the row of `id` names a folder that is not one inside `repro/`; null when none does. */
62
- const escapingRow = (paper, shown, id, deps) => {
63
- const r = registryOf(paper, deps);
64
- const readable = readableFolders(paper, deps);
65
- const row = (r.kind === "read" ? r.registry.studies : []).find((x) => x.id === id && !readable(x.folder));
66
- return row === undefined
67
- ? null
68
- : refusal(`${id}: its row names the folder \`${row.folder}\`, which is not one folder inside ${shown}/${REPRO_DIR}/; nothing is read through it. Give the row its own folder's name.`);
70
+ /** The refusal when the row names a folder that may not be entered; null when it may. */
71
+ const escapingRow = (shown, row, folder) => {
72
+ const why = folder.refusal(row.folder);
73
+ if (why === null)
74
+ return null;
75
+ const { reason, fix } = folderRefusalText(why, shown);
76
+ return refusal(`${row.id}: its row names the folder \`${row.folder}\`, which ${reason}; nothing is read through it. ${fix}.`);
69
77
  };
78
+ /** The refusal of an id that two or more rows carry: the gate answers for exactly one study. */
79
+ const ambiguousRefusal = (shown, id, rows) => refusal(`${id}: ${String(rows.length)} rows of ${shown}/${REPRO_DIR}/${STUDIES_FILE} carry this id (folders ${rows.map((x) => `\`${x.folder}\``).join(", ")}); the gate answers for exactly one study. Give each other row the next free id and rename its folder to match, then run this again.`);
70
80
  /** The refusal of a study whose plan is still a draft: a mode decides nothing until its plan is ready. */
71
81
  const draftRefusal = (id, s) => {
72
82
  const names = s.empty.map((f) => `\`${f}\``).join(", ");
73
83
  const verb = s.empty.length === 1 ? "is" : "are";
74
84
  return refusal(`${id}: its ${s.plan} is a draft — ${names} ${verb} empty; the run waits for a ready plan. Fill it in, then run this again.`);
75
85
  };
76
- /** `studies gate`: 0 when the run may start, 1 with the reason when not. */
77
- export function runGate(paper, shown, id, deps) {
78
- const escaping = escapingRow(paper, shown, id, deps);
86
+ /** The gate of the one row `row`. */
87
+ const gateRow = (run, row) => {
88
+ const { shown, folder, deps } = run;
89
+ const escaping = escapingRow(shown, row, folder);
79
90
  if (escaping !== null)
80
91
  return refused(escaping);
81
- const s = modeStudies(paper, deps).find((m) => m.row.id === id);
82
- if (s === undefined)
83
- return refused(refusal(`${id} declares no mode in ${shown}: no row of ${shown}/${REPRO_DIR}/studies.json with this id names a plan.json that parses with \`mode\`. Lint the paper (\`npx paperlint lint\`) to see why.`));
92
+ const read = readModeStudy(row, folder, deps.codec);
93
+ if (read.kind === "linked")
94
+ return refused(linkedPlanRefusal(shown, row, read.link));
95
+ if (read.kind === "none")
96
+ return refused(noModeRefusal(shown, row.id));
97
+ const s = read.study;
84
98
  if (s.empty.length > 0)
85
- return refused(draftRefusal(id, s));
99
+ return refused(draftRefusal(row.id, s));
86
100
  return s.mode.kind === "decide_before_run"
87
- ? gateDecided(paper, s.row, s.mode, deps)
101
+ ? gateDecided(run, s.row, s.mode)
88
102
  : {
89
103
  ok: true,
90
104
  lines: [
91
- `${id} is exploratory (${s.mode.reason}): it has no gate, and its results are reported as exploratory.`,
105
+ `${row.id} is exploratory (${s.mode.reason}): it has no gate, and its results are reported as exploratory.`,
92
106
  ],
93
107
  };
108
+ };
109
+ /** The refusal of a plan whose path passes through a symbolic link. */
110
+ const linkedPlanRefusal = (shown, row, link) => refusal(`${row.id}: the plan its row names, in ${shown}/${REPRO_DIR}/${row.folder}, passes through the symbolic link \`${link}\`; nothing is read through a link. Replace the link with the plan file itself, then run this again.`);
111
+ /** The refusal of an id no row declares a mode for. */
112
+ const noModeRefusal = (shown, id) => refusal(`${id} declares no mode in ${shown}: the plan its row names in ${shown}/${REPRO_DIR}/${STUDIES_FILE} is missing, does not parse, or has no \`mode\`. Lint the paper (\`npx paperlint lint\`) to see why.`);
113
+ /** The refusal of an id that no row of the registry carries. */
114
+ const unknownIdRefusal = (shown, id) => refusal(`${id}: no row of ${shown}/${REPRO_DIR}/${STUDIES_FILE} carries this id. Use an id from the registry, or register the study with \`npx paperlint studies new\`, then run this again.`);
115
+ /** The refusal of a registry that is not there or does not parse: no row can carry the id. */
116
+ const registryRefusal = (shown, id, r) => refusal(`${id}: the registry ${shown}/${REPRO_DIR}/${STUDIES_FILE} ${r.kind === "absent" ? "is missing" : `does not parse (${r.why})`}, so no row can carry this id. Run \`npx paperlint lint\` to see why, then run this again.`);
117
+ /** `studies gate`: 0 when the run may start, 1 with the reason when not. */
118
+ export function runGate(paper, shown, id, deps) {
119
+ const r = registryOf(paper, deps);
120
+ if (r.kind !== "read")
121
+ return refused(registryRefusal(shown, id, r));
122
+ const found = studyById(studiesOf(r), id);
123
+ switch (found.kind) {
124
+ case "none":
125
+ return refused(unknownIdRefusal(shown, id));
126
+ case "ambiguous":
127
+ return refused(ambiguousRefusal(shown, id, found.rows));
128
+ case "one":
129
+ return gateRow({ paper, shown, folder: studyFolder(paper, deps), deps }, found.row);
130
+ }
94
131
  }
95
132
  //# sourceMappingURL=study-gate.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"study-gate.js","sourceRoot":"","sources":["../src/study-gate.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"study-gate.js","sourceRoot":"","sources":["../src/study-gate.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { IndexInput, RegistryState } from "./domain/study-registry.ts";
1
+ import { type IndexInput, type RegistryState } from "./domain/study-registry.ts";
2
2
  import { type OrderDeps } from "./outputs-before-decision-rule.ts";
3
3
  /** The plans and the histories of the paper folder `paper`, whose registry is `r`. */
4
4
  export declare const indexInputOf: (paper: string, r: RegistryState, deps: OrderDeps) => IndexInput;
@@ -1 +1 @@
1
- {"version":3,"file":"study-index-input.d.ts","sourceRoot":"","sources":["../src/study-index-input.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAEL,KAAK,SAAS,EACf,MAAM,mCAAmC,CAAC;AAG3C,sFAAsF;AACtF,eAAO,MAAM,YAAY,GACvB,OAAO,MAAM,EACb,GAAG,aAAa,EAChB,MAAM,SAAS,KACd,UAKD,CAAC"}
1
+ {"version":3,"file":"study-index-input.d.ts","sourceRoot":"","sources":["../src/study-index-input.ts"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,UAAU,EACf,KAAK,aAAa,EACnB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAEL,KAAK,SAAS,EACf,MAAM,mCAAmC,CAAC;AAI3C,sFAAsF;AACtF,eAAO,MAAM,YAAY,GACvB,OAAO,MAAM,EACb,GAAG,aAAa,EAChB,MAAM,SAAS,KACd,UAQD,CAAC"}
@@ -3,11 +3,16 @@
3
3
  * row's plan, and each decide-first study's history as git gives it now (src/domain/index-columns.ts).
4
4
  */
5
5
  import { indexHistory } from "./domain/index-columns.js";
6
+ import { folderKey, } from "./domain/study-registry.js";
6
7
  import { decideFirstStudies, } from "./outputs-before-decision-rule.js";
7
- import { plansOf, readableFolders } from "./study-registry-rule.js";
8
+ import { studyFolder } from "./study-folder.js";
9
+ import { plansOf } from "./study-registry-rule.js";
8
10
  /** The plans and the histories of the paper folder `paper`, whose registry is `r`. */
9
11
  export const indexInputOf = (paper, r, deps) => ({
10
- plans: plansOf(paper, r, deps, readableFolders(paper, deps)),
11
- history: new Map(decideFirstStudies(paper, deps).map((s) => [s.id, indexHistory(s)])),
12
+ plans: plansOf(r, studyFolder(paper, deps), deps.codec),
13
+ history: new Map(decideFirstStudies(paper, deps).map((s) => [
14
+ folderKey(s.folder, s.plan),
15
+ indexHistory(s),
16
+ ])),
12
17
  });
13
18
  //# sourceMappingURL=study-index-input.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"study-index-input.js","sourceRoot":"","sources":["../src/study-index-input.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAEzD,OAAO,EACL,kBAAkB,GAEnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAEpE,sFAAsF;AACtF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,KAAa,EACb,CAAgB,EAChB,IAAe,EACH,EAAE,CAAC,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC5D,OAAO,EAAE,IAAI,GAAG,CACd,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CACpE;CACF,CAAC,CAAC"}
1
+ {"version":3,"file":"study-index-input.js","sourceRoot":"","sources":["../src/study-index-input.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AACzD,OAAO,EACL,SAAS,GAGV,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,kBAAkB,GAEnB,MAAM,mCAAmC,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AAEnD,sFAAsF;AACtF,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,KAAa,EACb,CAAgB,EAChB,IAAe,EACH,EAAE,CAAC,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC;IACvD,OAAO,EAAE,IAAI,GAAG,CACd,kBAAkB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACzC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;QAC3B,YAAY,CAAC,CAAC,CAAC;KAChB,CAAC,CACH;CACF,CAAC,CAAC"}
@@ -1,31 +1,25 @@
1
- import type { StudyMode } from "./domain/study-mode.ts";
2
1
  import type { NotAFile } from "./domain/decide-first.ts";
3
- import { type PlanTextField, type Study } from "./domain/study-registry.ts";
4
- import type { Files } from "./ports/files.ts";
2
+ import type { StudyMode } from "./domain/study-mode.ts";
3
+ import { type PlanTextField, type RegistryState, type Study } from "./domain/study-registry.ts";
5
4
  import type { StudyRegistryCodec } from "./ports/study-registry-codec.ts";
6
- import type { ListEntries } from "./ports/list-entries.ts";
7
- import type { ListDir } from "./ports/talk-media.ts";
8
- /** What reading a paper's studies needs: the disk, its listings with and without kinds, and the parsers. */
9
- export interface StudyDeps {
10
- readonly files: Files;
11
- readonly listDir: ListDir;
12
- readonly entries: ListEntries;
13
- readonly codec: StudyRegistryCodec;
14
- }
15
- /** What a decision path names on disk: a file, nothing, or something git cannot vouch for. */
16
- export type OnDisk = "file" | "absent" | NotAFile;
5
+ import type { StudyFolder } from "./ports/study-folder.ts";
6
+ /** Whether a decision path is one git can vouch for: a file or nothing yet; else why not. */
7
+ export type DecisionEntry = {
8
+ readonly kind: "ok";
9
+ } | {
10
+ readonly kind: "not-a-file";
11
+ readonly what: NotAFile;
12
+ } | {
13
+ readonly kind: "linked";
14
+ readonly link: string;
15
+ };
17
16
  /**
18
- * What `p` is on disk, read from its directory's entries without following a link: a decision must
19
- * be a regular file — git answers for a directory with the commits of anything under it, and for a
20
- * link with the link, not the file it points to.
17
+ * What the decision file `file` (relative to the paper) is, read through `folder` without following
18
+ * a link: a decision must be a regular file in real directories — git answers for a directory with
19
+ * the commits of anything under it, for a link with the link and not the file it points to, and for a
20
+ * path through a linked directory with what lies behind the link.
21
21
  */
22
- export declare const onDisk: (p: string, deps: Pick<StudyDeps, "entries">) => OnDisk;
23
- /**
24
- * Every file under `dir`, relative to it, `/`-separated; none when it is not a directory. A symbolic
25
- * link is listed as a file — git stores it as one — and never followed: a link to the folder itself
26
- * would recurse forever, and one to a tree outside would bring its files into the study.
27
- */
28
- export declare const filesUnder: (dir: string, deps: Pick<StudyDeps, "entries">, prefix?: string) => readonly string[];
22
+ export declare const decisionEntry: (folder: StudyFolder, file: string) => DecisionEntry;
29
23
  /**
30
24
  * A study whose plan parsed with a mode: its row, the plan's path in its folder, the mode, and the
31
25
  * plan's empty texts — none when it is ready. Only a ready plan's mode decides anything: a draft may
@@ -37,9 +31,26 @@ export interface ModeStudy {
37
31
  readonly mode: StudyMode;
38
32
  readonly empty: readonly PlanTextField[];
39
33
  }
34
+ /** What reading the plan of one row gave: its mode study, nothing, or a link on the way to it. */
35
+ export type ModeRead = {
36
+ readonly kind: "mode";
37
+ readonly study: ModeStudy;
38
+ } | {
39
+ readonly kind: "none";
40
+ } | {
41
+ readonly kind: "linked";
42
+ readonly link: string;
43
+ };
44
+ /**
45
+ * The plan of the row `s`, read through `folder` (`src/study-folder.ts`, which follows no link and
46
+ * enters no folder that is not one inside `repro/`): its mode study when the plan parsed with a
47
+ * mode; a link on the way to it; else nothing.
48
+ */
49
+ export declare const readModeStudy: (s: Study, folder: StudyFolder, codec: StudyRegistryCodec) => ModeRead;
40
50
  /**
41
- * Every study of the paper folder `paper` whose plan declares a mode, in registry order. A plan that
42
- * does not parse is `repro/study-registered`'s to report; here it declares nothing.
51
+ * Every study of the registry `r` whose plan declares a mode, in registry order. A plan that does
52
+ * not parse, or is reached through a link, is `repro/study-registered`'s to report; here it declares
53
+ * nothing.
43
54
  */
44
- export declare const modeStudies: (paper: string, deps: Pick<StudyDeps, "files" | "codec" | "entries">) => readonly ModeStudy[];
55
+ export declare const modeStudies: (r: RegistryState, folder: StudyFolder, codec: StudyRegistryCodec) => readonly ModeStudy[];
45
56
  //# sourceMappingURL=study-modes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"study-modes.d.ts","sourceRoot":"","sources":["../src/study-modes.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,KAAK,EACX,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,KAAK,EAAY,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGrD,4GAA4G;AAC5G,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,kBAAkB,CAAC;CACpC;AAED,8FAA8F;AAC9F,MAAM,MAAM,MAAM,GAAG,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAQlD;;;;GAIG;AACH,eAAO,MAAM,MAAM,GAAI,GAAG,MAAM,EAAE,MAAM,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,KAAG,MAKpE,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,UAAU,GACrB,KAAK,MAAM,EACX,MAAM,IAAI,CAAC,SAAS,EAAE,SAAS,CAAC,EAChC,eAAW,KACV,SAAS,MAAM,EAId,CAAC;AAEL;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;CAC1C;AA6BD;;;GAGG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,MAAM,EACb,MAAM,IAAI,CAAC,SAAS,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC,KACnD,SAAS,SAAS,EAOpB,CAAC"}
1
+ {"version":3,"file":"study-modes.d.ts","sourceRoot":"","sources":["../src/study-modes.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,KAAK,EACX,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,iCAAiC,CAAC;AAC1E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,6FAA6F;AAC7F,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAA;CAAE,GACvB;IAAE,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,GACxD;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GACxB,QAAQ,WAAW,EACnB,MAAM,MAAM,KACX,aAQF,CAAC;AAEF;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;CAC1C;AAED,kGAAkG;AAClG,MAAM,MAAM,QAAQ,GAChB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAA;CAAE,GACpD;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzB;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvD;;;;GAIG;AACH,eAAO,MAAM,aAAa,GACxB,GAAG,KAAK,EACR,QAAQ,WAAW,EACnB,OAAO,kBAAkB,KACxB,QAcF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,GAAG,aAAa,EAChB,QAAQ,WAAW,EACnB,OAAO,kBAAkB,KACxB,SAAS,SAAS,EAMlB,CAAC"}